package com.ruoyi.web.controller.gcgl;

import java.util.Date;
import java.util.List;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.gcgl.domain.GysptWarehouse;
import com.ruoyi.gcgl.domain.GysptWarehouseRequisitio;
import com.ruoyi.gcgl.domain.GysptWarehouseRequisitioitem;
import com.ruoyi.gcgl.domain.GysptWarehouseitem;
import com.ruoyi.gcgl.service.IGysptWarehouseRequisitioService;
import com.ruoyi.gcgl.service.IGysptWarehouseRequisitioitemService;
import com.ruoyi.gcgl.service.IGysptWarehouseService;
import com.ruoyi.gcgl.service.IGysptWarehouseitemService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.uuid.ReturnUUID;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 调拨单Controller
 * 
 * @author ruoyi
 * @date 2024-12-01
 */
@Controller
@RequestMapping("/gcgl/requisitio")
public class GysptWarehouseRequisitioController extends BaseController
{
    private String prefix = "gcgl/requisitio";

    @Autowired
    private IGysptWarehouseRequisitioService gysptWarehouseRequisitioService;
    @Autowired
    private IGysptWarehouseRequisitioitemService gysptWarehouseRequisitioitemService;
    @Autowired
    private IGysptWarehouseService gysptWarehouseService;
    @Autowired
    private IGysptWarehouseitemService gysptWarehouseitemService;

    @RequiresPermissions("gcgl:requisitio:view")
    @GetMapping()
    public String requisitio()
    {
        return prefix + "/requisitio";
    }

    /**
     * 查询调拨单列表
     */
    @RequiresPermissions("gcgl:requisitio:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(GysptWarehouseRequisitio gysptWarehouseRequisitio)
    {
        startPage();
        gysptWarehouseRequisitio.setDeleteFlag(1);
        List<GysptWarehouseRequisitio> list = gysptWarehouseRequisitioService.selectGysptWarehouseRequisitioList(gysptWarehouseRequisitio);
        return getDataTable(list);
    }

    /**
     * 导出调拨单列表
     */
    @RequiresPermissions("gcgl:requisitio:export")
    @Log(title = "调拨单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(GysptWarehouseRequisitio gysptWarehouseRequisitio)
    {
        List<GysptWarehouseRequisitio> list = gysptWarehouseRequisitioService.selectGysptWarehouseRequisitioList(gysptWarehouseRequisitio);
        ExcelUtil<GysptWarehouseRequisitio> util = new ExcelUtil<GysptWarehouseRequisitio>(GysptWarehouseRequisitio.class);
        return util.exportExcel(list, "调拨单数据");
    }

    /**
     * 新增调拨单
     */
    @GetMapping("/add")
    public String add(ModelMap mmap)
    {
    	mmap.put("requisitioNo", ReturnUUID.getOrderNo("R"));
    	mmap.put("requisitioriq", new Date());
        return prefix + "/add";
    }

    /**
     * 新增保存调拨单
     */
    @RequiresPermissions("gcgl:requisitio:add")
    @Log(title = "调拨单", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(GysptWarehouseRequisitio gysptWarehouseRequisitio){
    	try {
    		gysptWarehouseRequisitio.setStatus(1);
        	gysptWarehouseRequisitio.setDeleteFlag(1);
        	gysptWarehouseRequisitio.setCreateAt(new Date());
        	gysptWarehouseRequisitio.setUpdateAt(new Date());
        	gysptWarehouseRequisitio.setCreateUser(getLoginName());
        	gysptWarehouseRequisitio.setUpdateUser(getLoginName());
        	gysptWarehouseRequisitioService.insertGysptWarehouseRequisitio(gysptWarehouseRequisitio);
        	for(GysptWarehouseRequisitioitem item : gysptWarehouseRequisitio.getItems()){
        		item.setWarehouseId(gysptWarehouseRequisitio.getWarehouseId());
        		item.setRequisitioId(gysptWarehouseRequisitio.getId());
        		item.setRequisitioNo(gysptWarehouseRequisitio.getRequisitioNo());
        		item.setStatus(1);
        		item.setDeleteFlag(1);
        		item.setCreateAt(new Date());
        		item.setUpdateAt(new Date());
        		item.setCreateUser(getLoginName());
        		item.setUpdateUser(getLoginName());
        		gysptWarehouseRequisitioitemService.insertGysptWarehouseRequisitioitem(item);
        	}
        	//调用调拨接口
        	diaobodan(gysptWarehouseRequisitio);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return toAjax(0);
		}
    	
        return toAjax(1);
    }
    
    /**
     * 调拨单
     * @param gysptWarehouseRequisitio
     * @return
     */
    private boolean diaobodan(GysptWarehouseRequisitio gysptWarehouseRequisitio){
    	try {
    		for(GysptWarehouseRequisitioitem requisitioitem : gysptWarehouseRequisitio.getItems()){
        		//原地址
        		GysptWarehouseitem item = new GysptWarehouseitem();
            	item.setDeleteFlag(1);
            	item.setWarehouseId(gysptWarehouseRequisitio.getWarehouseId());
            	item.setMingc(requisitioitem.getMingc());
            	item.setGuig(requisitioitem.getGuig());
            	List<GysptWarehouseitem> warehouseitemlis = gysptWarehouseitemService.selectGysptWarehouseitemList(item);
            	
            	//目标地址
        		GysptWarehouseitem toitem = new GysptWarehouseitem();
        		toitem.setDeleteFlag(1);
        		toitem.setWarehouseId(gysptWarehouseRequisitio.getTowarehouseId());
        		toitem.setMingc(requisitioitem.getMingc());
        		toitem.setGuig(requisitioitem.getGuig());
            	List<GysptWarehouseitem> towarehouseitemlis = gysptWarehouseitemService.selectGysptWarehouseitemList(toitem);
            	
            	//调拨数量
            	String diaobshul = requisitioitem.getShul();
            	
            	if(warehouseitemlis!=null && warehouseitemlis.size()>0){
            		
            		GysptWarehouseitem warehouseitem = warehouseitemlis.get(0);
            		String kucshul = warehouseitem.getKucshul();
            		GysptWarehouseitem towarehouseitem = new GysptWarehouseitem();
            		String tokucshul = "0";
            		
            		if(towarehouseitemlis!=null && towarehouseitemlis.size()>0){
            			towarehouseitem = towarehouseitemlis.get(0);
            			tokucshul = towarehouseitem.getKucshul();
            		}else{
            			towarehouseitem.setWarehouseId(gysptWarehouseRequisitio.getTowarehouseId());
            			towarehouseitem.setClbh(warehouseitem.getClbh());
            			towarehouseitem.setClfl(warehouseitem.getClfl());
            			towarehouseitem.setMingc(warehouseitem.getMingc());
            			towarehouseitem.setClpp(warehouseitem.getClpp());
            			towarehouseitem.setGuig(warehouseitem.getGuig());
            			towarehouseitem.setDanw(warehouseitem.getDanw());
            			towarehouseitem.setKucshul(tokucshul);
            			towarehouseitem.setLinglCount("0");
            			towarehouseitem.setFeilCount("0");
            			towarehouseitem.setZdjine(warehouseitem.getZdjine());
            			towarehouseitem.setStatus(0);
            			towarehouseitem.setDeleteFlag(1);
            			towarehouseitem.setUpdateUser(getLoginName());
            			towarehouseitem.setUpdateAt(new Date());
            			towarehouseitem.setCreateUser(getLoginName());
            			towarehouseitem.setCreateAt(new Date());
            			gysptWarehouseitemService.insertGysptWarehouseitem(towarehouseitem);
            		}
            		
            		//更新原
            		Integer shul = Integer.parseInt(kucshul)-Integer.parseInt(diaobshul);
            		warehouseitem.setKucshul(shul.toString());
            		gysptWarehouseitemService.updateGysptWarehouseitem(warehouseitem);
            		
            		//更新目标
            		Integer toshul = Integer.parseInt(tokucshul)+Integer.parseInt(diaobshul);
            		towarehouseitem.setKucshul(toshul.toString());
            		gysptWarehouseitemService.updateGysptWarehouseitem(towarehouseitem);
            	}
        	}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return false;
		}
    	
		return true;
    }

    /**
     * 修改调拨单
     */
    @RequiresPermissions("gcgl:requisitio:edit")
    @GetMapping("/edit/{id}")
    public String edit(@PathVariable("id") Long id, ModelMap mmap)
    {
        GysptWarehouseRequisitio gysptWarehouseRequisitio = gysptWarehouseRequisitioService.selectGysptWarehouseRequisitioById(id);
        GysptWarehouseRequisitioitem item = new GysptWarehouseRequisitioitem();
        item.setDeleteFlag(1);
        item.setRequisitioId(id);
        List<GysptWarehouseRequisitioitem> items = gysptWarehouseRequisitioitemService.selectGysptWarehouseRequisitioitemList(item);
        gysptWarehouseRequisitio.setItems(items);
        mmap.put("gysptWarehouseRequisitio", gysptWarehouseRequisitio);
        
        GysptWarehouse warehouse = 
        		gysptWarehouseService.selectGysptWarehouseById(gysptWarehouseRequisitio.getWarehouseId());
        mmap.put("warehouse", warehouse);
        
        GysptWarehouse towarehouse = 
        		gysptWarehouseService.selectGysptWarehouseById(gysptWarehouseRequisitio.getTowarehouseId());
        mmap.put("towarehouse", towarehouse);
        
        return prefix + "/edit";
    }

    /**
     * 修改保存调拨单
     */
    @RequiresPermissions("gcgl:requisitio:edit")
    @Log(title = "调拨单", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(GysptWarehouseRequisitio gysptWarehouseRequisitio){
    	
    	gysptWarehouseRequisitio.setStatus(1);
    	gysptWarehouseRequisitio.setDeleteFlag(1);
    	gysptWarehouseRequisitio.setUpdateAt(new Date());
    	gysptWarehouseRequisitio.setUpdateUser(getLoginName());
    	gysptWarehouseRequisitioService.updateGysptWarehouseRequisitio(gysptWarehouseRequisitio);

        return toAjax(1);
    }

    /**
     * 删除调拨单
     */
    @RequiresPermissions("gcgl:requisitio:remove")
    @Log(title = "调拨单", businessType = BusinessType.DELETE)
    @PostMapping( "/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        return toAjax(gysptWarehouseRequisitioService.deleteGysptWarehouseRequisitioByIds(ids));
    }
    
    //----------------
    @GetMapping("/subdiaobo/{id}")
    public String subdiaobo(@PathVariable("id") Long id, ModelMap mmap){
    	GysptWarehouse wh = gysptWarehouseService.selectGysptWarehouseById(id);
    	mmap.put("wh", wh);
        return prefix + "/subdiaobo";
    }

    /**
     * 查询调拨单列表
     */
    @PostMapping("/diaobolist")
    @ResponseBody
    public TableDataInfo diaobolist(GysptWarehouseitem gysptWarehouseitem){
        startPage();
        gysptWarehouseitem.setDeleteFlag(1);
        gysptWarehouseitem.setWarehouseId(gysptWarehouseitem.getWarehouseId());
        gysptWarehouseitem.setKucshul("1");// Kucshul>0 启动 kucshul-linglCount>0
        List<GysptWarehouseitem> list = gysptWarehouseitemService.selectGysptWarehouseitemList(gysptWarehouseitem);
        
        for(GysptWarehouseitem itm:list){
        	int linglCount = Integer.parseInt(itm.getLinglCount());
        	int feilCount = Integer.parseInt(itm.getFeilCount());
        	int kucshul = Integer.parseInt(itm.getKucshul());
        	int shul = kucshul-linglCount-feilCount;
        	itm.setShul(String.valueOf(shul));
        	
            GysptWarehouse wh = gysptWarehouseService.selectGysptWarehouseById(itm.getWarehouseId());
            itm.setWarehouseName(wh.getName());
        }
        return getDataTable(list);
    }
}